// SearchZ3950.cpp : implementation file
//

#include "stdafx.h"
#include "isismarc.h"
#include "SearchZ3950.h"
#include "afxcmn.h"
#include "global.h"



#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CSearchZ3950 dialog


CSearchZ3950::CSearchZ3950(CWnd* pParent /*=NULL*/)
	: CDialog(CSearchZ3950::IDD, pParent)
{
	//{{AFX_DATA_INIT(CSearchZ3950)
	//}}AFX_DATA_INIT
	
}

CSearchZ3950::~CSearchZ3950()
{
	if (m_pImageList!=NULL)
		delete m_pImageList;
}

void CSearchZ3950::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CSearchZ3950)
	DDX_Control(pDX, IDC_LIMITS, m_LimitsLabel);
	DDX_Control(pDX, IDC_EXPRESSION, m_ExpressionLabel);
	DDX_Control(pDX, IDC_CHECK1, m_SelectAll);
	DDX_Control(pDX, IDC_TOPERESULTADOS, m_LimiteResultados);
	DDX_Control(pDX, IDC_LSERVERS, m_LabelServers);
	DDX_Control(pDX, IDC_OPERADOR1, m_Operador1);
	DDX_Control(pDX, IDC_OPERADOR2, m_Operador2);
	DDX_Control(pDX, IDC_CAMPO3, m_Campo3);
	DDX_Control(pDX, IDC_CAMPO2, m_Campo2);
	DDX_Control(pDX, IDC_CAMPO1, m_Campo1);
	DDX_Control(pDX, IDC_EXPRESION3, m_Expresion3);
	DDX_Control(pDX, IDC_EXPRESION2, m_Expresion2);
	DDX_Control(pDX, IDC_EXPRESION1, m_Expresion1);
	DDX_Control(pDX, IDC_LISTADESTINOS, m_ListaDestinos);
	DDX_Control(pDX, IDOK, m_BotonGo);
	DDX_Control(pDX, IDCANCEL, m_Cancelar);
	//}}AFX_DATA_MAP
}



BEGIN_MESSAGE_MAP(CSearchZ3950, CDialog)
	//{{AFX_MSG_MAP(CSearchZ3950)
	ON_WM_CANCELMODE()
	ON_LBN_SELCHANGE(IDC_LISTADESTINOS, OnSelchangeListaServers)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDOK, OnBotonGo)
	ON_WM_CAPTURECHANGED()
	ON_BN_CLICKED(IDC_CHECK1, OnSeleccionarTodos)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CSearchZ3950 message handlers

BOOL CSearchZ3950::OnInitDialog() 
{

   /*Testear este codigo

   BOOL bConnected;
   DWORD dwFlags;
 
   bConnected = InternetGetConnectedState ( &dwFlags, 0 );
 
   if ( bConnected )
    if ( dwFlags & INTERNET_CONNECTION_OFFLINE )
      bConnected = FALSE; */


	CDialog::OnInitDialog();
	
	// TODO: Add extra initialization here
	
	SetWindowText(tMensaje[42][7]);
	SetIcon (AfxGetApp()->LoadIcon(IDR_MAINFRAME),false);
	

	m_pImageList = new CImageList();
	ASSERT(m_pImageList != NULL);    // serious allocation failure checking
	m_pImageList->Create(16, 16, ILC_MASK,   1, 1);
	m_pImageList->Add(AfxGetApp()->LoadIcon(IDI_ICONOSERVERS));

	m_ListaDestinos.SetImageList(m_pImageList, LVSIL_SMALL);
	m_ListaDestinos.SetExtendedStyle ( LVS_EX_FULLROWSELECT );



	int n_Elemento;

	//m_ListaDestinos.Clear();
	m_LabelServers.SetWindowText(tMensaje[42][8]);
	//m_LabelSearches.SetWindowText(tMensaje[42][9]);

	m_BotonGo.SetWindowText(tMensaje[43][1]);

	
	m_Cancelar.SetWindowText(tMensaje[43][5]);

	//CargarServidores();

	m_Campo1.AddString(tMensaje[43][6]);
	m_Campo1.AddString(tMensaje[43][7]);
	m_Campo1.AddString(tMensaje[43][8]);
	m_Campo1.AddString(tMensaje[43][9]);
	m_Campo1.AddString(tMensaje[44][0]);
	m_Campo1.AddString(tMensaje[44][1]);
	m_Campo1.AddString(tMensaje[44][2]);
	m_Campo1.AddString(tMensaje[44][3]);
	m_Campo1.AddString(tMensaje[44][4]);
	m_Campo1.AddString(tMensaje[44][5]);
	m_Campo1.AddString(tMensaje[44][6]);
	

	m_Campo2.AddString(tMensaje[43][6]);
	m_Campo2.AddString(tMensaje[43][7]);
	m_Campo2.AddString(tMensaje[43][8]);
	m_Campo2.AddString(tMensaje[43][9]);
	m_Campo2.AddString(tMensaje[44][0]);
	m_Campo2.AddString(tMensaje[44][1]);
	m_Campo2.AddString(tMensaje[44][2]);
	m_Campo2.AddString(tMensaje[44][3]);
	m_Campo2.AddString(tMensaje[44][4]);
	m_Campo2.AddString(tMensaje[44][5]);
	m_Campo2.AddString(tMensaje[44][6]);

	


	m_Campo3.AddString(tMensaje[43][6]);
	m_Campo3.AddString(tMensaje[43][7]);
	m_Campo3.AddString(tMensaje[43][8]);
	m_Campo3.AddString(tMensaje[43][9]);
	m_Campo3.AddString(tMensaje[44][0]);
	m_Campo3.AddString(tMensaje[44][1]);
	m_Campo3.AddString(tMensaje[44][2]);
	m_Campo3.AddString(tMensaje[44][3]);
	m_Campo3.AddString(tMensaje[44][4]);
	m_Campo3.AddString(tMensaje[44][5]);
	m_Campo3.AddString(tMensaje[44][6]);

	

	m_Operador1.AddString ("AND");
	m_Operador1.AddString ("OR");
	m_Operador1.AddString ("NOT");
	m_Operador1.SetCurSel(0);

	m_Operador2.AddString ("AND");
	m_Operador2.AddString ("OR");
	m_Operador2.AddString ("NOT");
	m_Operador2.SetCurSel(0);

	m_LimiteResultados.AddString("10 "+tMensaje[44][7]);
	m_LimiteResultados.AddString("25 "+tMensaje[44][7]);
	m_LimiteResultados.AddString("50 "+tMensaje[44][7]);
	m_LimiteResultados.AddString("100 "+tMensaje[44][7]);
	m_LimiteResultados.AddString("200 "+tMensaje[44][7]);
	m_LimiteResultados.AddString("300 "+tMensaje[44][7]);
	m_LimiteResultados.AddString("400 "+tMensaje[44][7]);
	m_LimiteResultados.AddString("500 "+tMensaje[44][7]);
	m_LimiteResultados.SetCurSel(0);

	cmiServers.IsisIniciarRegistro(cip_servers+"server.mst");
	char area[255];

	m_ListaDestinos.InsertColumn(0,tMensaje[49][0], LVCFMT_LEFT,300);
	m_ListaDestinos.InsertColumn(1,tMensaje[49][1], LVCFMT_LEFT,160); 
	m_ListaDestinos.InsertColumn(2,tMensaje[49][2], LVCFMT_LEFT,140);
	m_ListaDestinos.InsertColumn(3,tMensaje[49][3], LVCFMT_LEFT,140);
	m_ListaDestinos.InsertColumn(4,"UTF-8", LVCFMT_LEFT,140);

	for (int i=1;i<=cmiServers.IsisCantRegistros();i++)
	{
		int r=cmiServers.IsisRegistro(i,false);
		if (r!=ERR_RECLOGIDEL)
		{
			cmiServers.IsisCampo(1,i,1,area,sizeof(area));
			n_Elemento = m_ListaDestinos.InsertItem(i,area);
			cmiServers.IsisCampo(4,i,1,area,sizeof(area));
			m_ListaDestinos.SetItemText(n_Elemento,1,area);
			
			// Aca va la URI y puerto 7/7/04
			cmiServers.IsisCampo(2,i,1,area,sizeof(area));
			m_ListaDestinos.SetItemText(n_Elemento,2,area);
			cmiServers.IsisCampo(3,i,1,area,sizeof(area));
			m_ListaDestinos.SetItemText(n_Elemento,3,area);

			//m_ListaDestinos.SetItemData(m_ListaDestinos.GetCount()-1,);
			cmiServers.IsisCampo(5,i,1,area,sizeof(area));
			m_ListaDestinos.SetItemText(n_Elemento,4,area);
		}

		
	}

	m_Campo1.SetCurSel(0);
	m_Campo1.SetFocus();
	m_Campo2.SetCurSel(0);
	m_Campo2.SetFocus();
	m_Campo3.SetCurSel(0);
	m_Campo3.SetFocus();

	m_ListaDestinos.SetFocus();


	CFont* mi_fuente = new CFont;
	mi_fuente->CreateFont(14,0,0,0,700,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,0,"Arial");
	m_BotonGo.SetFont(mi_fuente);

	m_SelectAll.SetWindowText(tMensaje[44][8]);
	m_ExpressionLabel.SetWindowText(tMensaje[44][9]);
	m_LimitsLabel.SetWindowText(tMensaje[45][0]);
	


	//m_LabelResultados.SetWindowText(tMensaje[43][1]);

	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}

void CSearchZ3950::OnCancelMode() 
{
	CDialog::OnCancelMode();
	
	// TODO: Add your message handler code here
	
}

void CSearchZ3950::OnSelchangeListaServers() 
{
	// TODO: Add your control notification handler code here
//	CargarListaBusquedas(codigo);
	
}


void CSearchZ3950::OnBotonGo() 
{
	
	CString cadena1,cadena2,cadena3;

	m_Expresion1.GetWindowText(cadena1);
	m_Expresion2.GetWindowText(cadena2);
	m_Expresion3.GetWindowText(cadena3);

	if (cadena1.GetLength()==0 || (cadena2.GetLength()==0 && cadena3.GetLength()>0))
	{
		AfxMessageBox (tMensaje[46][4]);
		return;
		
	}


	CString PQNQuery = CalcularExpresion(cadena1,cadena2,cadena3);
	

	CListCtrl* pListCtrl = (CListCtrl*) GetDlgItem(IDC_LISTADESTINOS);
	ASSERT(pListCtrl != NULL);

	destino midest;


	
	POSITION pos = pListCtrl->GetFirstSelectedItemPosition();
	if (pos == NULL)
	{
			AfxMessageBox (tMensaje[46][3]);
			return;
	}
	else
	{
			CString cadena="";					
			cadena.Format("%d",cmiBusquedas.IsisCantRegistros()+1);

			cadena="<1>"+cadena+"</1>";
			cadena+="<2>"+FechaHoraLegible()+"</2>";
			cadena+="<3>"+ParsingIsis()+"</3>";
			
			while (pos)
			{
				// Cambio los valores de orden en la lista
				int nItem = pListCtrl->GetNextSelectedItem(pos);

				midest.host = m_ListaDestinos.GetItemText(nItem,2);
				midest.port = m_ListaDestinos.GetItemText(nItem,3);
				midest.database = m_ListaDestinos.GetItemText(nItem,1);
				midest.utf = m_ListaDestinos.GetItemText(nItem,4);
				CString name = m_ListaDestinos.GetItemText(nItem,0);
				
				cadena+="<4>^a"+midest.host+"^b"+midest.port+"^c"+midest.database+"^d"+name+"^e"+midest.utf+"</4>";
			}


			CString micadena;
			m_LimiteResultados.GetLBText(m_LimiteResultados.GetCurSel(),micadena);

			micadena = micadena.Left(3);
			micadena.TrimRight();

			cadena+="<5>"+micadena+"</5>";
			cadena+="<6>"+PQNQuery+"</6>";			

			// Registro el estado como pendiente de atencion

			cadena+="<7>0</7>";			
			
			int r = cmiBusquedas.IsisRegistroNuevo(cadena,true);
			if (r>0)
				EndDialog(1);
			else
				AfxMessageBox(tMensaje[46][6]);

	}	

/*
			CMainFrame *pFrame = (CMainFrame*)AfxGetApp()->m_pMainWnd;
			pFrame->OnStartSearch(PQNQuery,limite);
*/		
	
	
	
    
}

CString CSearchZ3950::Preprocesar(CString expresion)
{
	// Si hay mas de una palabra agregar comillas

	if (expresion.Find(" ")>0)
	{
		expresion='"'+expresion+'"';

		//  Sobre busqueda por frases no permito $
		expresion.Replace("$","");
	}

	
	// Si el primer caracter es $ y el ultimo no entonces
	// setear attr 5=2
	if (expresion.Left(1)=='$' && expresion.Mid(expresion.GetLength()-1,1)!='$')
		expresion = "@attr 5=2 "+expresion.Mid(1,expresion.GetLength());

	// Si el ultimo caracter es $ y el primero no
	// setear attr 5=1
	

	if (expresion.Left(1)!='$' && expresion.Mid(expresion.GetLength()-1,1)=='$')
		expresion = "@attr 5=1 "+expresion.Mid(0,expresion.GetLength()-1);


   return expresion;
}


CString CSearchZ3950::CalcularExpresion(CString expresion1,CString expresion2, CString expresion3)
{

	CString definitiva;

	expresion1 = Preprocesar(expresion1);
	if (expresion2.GetLength()>0)
		expresion2=Preprocesar(expresion2);

	if (expresion3.GetLength()>0)
		expresion3=Preprocesar(expresion3);

	definitiva = ObtenerAtributo(1)+expresion1;

	if (expresion2.GetLength()>0)
	{
		definitiva = ObtenerOperador(1)+definitiva+" "+ObtenerAtributo(2)+expresion2;
	}

	if (expresion3.GetLength()>0 && expresion2.GetLength()>0)
	{
		definitiva= ObtenerOperador(1)+" "+ObtenerOperador(2)+" "+ObtenerAtributo(1)+expresion1+" "+ObtenerAtributo(2)+expresion2+" "+ObtenerAtributo(3)+expresion3;
	}

	return definitiva;

}

CString CSearchZ3950::ObtenerOperador(int posicion)
{
	int numero=0;
	switch (posicion)
	{
		case 1:
			numero=m_Operador1.GetCurSel();
			break;
		default:
			numero=m_Operador2.GetCurSel();
			break;
		
	}

	switch (numero)
	{
		case 0:
			return "@and ";
		case 1:
			return "@or ";
		case 2:
			return "@not ";		
		default:
			return "@and ";
	}

}

CString CSearchZ3950::ObtenerAtributo(int posicion)
{
	int numero=0;
	switch (posicion)
	{
		case 1:
			numero=m_Campo1.GetCurSel();
			break;
		case 2:
			numero=m_Campo2.GetCurSel();
			break;
		default:
			numero=m_Campo3.GetCurSel();
			break;
		
	}

	switch (numero)
	{
		case 0:
			return "@attr 1=1003 ";
		case 1:
			return "@attr 1=1005 ";
		case 2:
			return "@attr 1=1006 ";
		case 3:
			return "@attr 1=4 ";
		case 4:
			return "@attr 1=5 ";
		case 5:
			return "@attr 1=6 ";
		case 6:
			return "@attr 1=7 ";
		case 7:
			return "@attr 1=7 ";		
		case 8:
			return "@attr 1=31 ";
		default:
			return "@attr 1=1016 ";
		
	}
}


void CSearchZ3950::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	
	//cmiBusquedas.IsisFin();

	CDialog::OnClose();
}


void CSearchZ3950::AssignHandler(CMyIsisMarcZ handler)
{
	cmiBusquedas = handler;
}



void CSearchZ3950::AssignTypeOperation(CString operacion)
{
	m_operacion = operacion;
}

CString CSearchZ3950::ParsingIsis()
{

	CString expresion1,expresion2,expresion3, definitiva;

	m_Expresion1.GetWindowText(expresion1);
	m_Expresion2.GetWindowText(expresion2);
	m_Expresion3.GetWindowText(expresion3);

	definitiva = expresion1;
	if (expresion2.GetLength()>0)
		definitiva+=ObtenerOperadorIsis(1)+expresion2;
	if (expresion3.GetLength()>0)
		definitiva+=ObtenerOperadorIsis(2)+expresion3;

	return definitiva;

}

CString CSearchZ3950::ObtenerOperadorIsis(int posicion)
{
	int numero=0;
	switch (posicion)
	{
		case 1:
			numero=m_Operador1.GetCurSel();
			break;
		default:
			numero=m_Operador2.GetCurSel();
			break;
		
	}

	switch (numero)
	{
		case 0:
			return " * ";
		case 2:
			return " not ";
		case 1:
			return " + ";
		default:
			return " * ";
	}

}

void CSearchZ3950::OnSeleccionarTodos() 
{
	// TODO: Add your control notification handler code here

	if (this->m_SelectAll)
	{
		int pos=0;
		while (pos<m_ListaDestinos.GetItemCount())
		{
			m_ListaDestinos.SetItemState(pos++,LVIS_SELECTED, LVIS_SELECTED |
                  LVIS_FOCUSED);
		}
	
	}
	
}
